// rutinas de manejo serial.

#include "p30F6010.h"

/*****************************************************************************
variables para manejo de USART
*/
#define MAXBUFRX_SIZE 16  
#define MAXBUFTX_SIZE 16 

char cAmarantaUartRxBufferIndex; 
char cAmarantaUartTxBufferIndex; 

char cAmarantaExecuteCommand;  
unsigned char ucAmarantaTxSize;

char pcAmarantaUartBufferRx[16];
char pcAmarantaUartBufferTx[16];

//******************************************************************************

void vAmarantaConfigUSART1(void)
{
	
	
	U1MODE=0;				 // en ceros
	U1MODEbits.UARTEN=1;     // habilita UART  // b10000000000000; 8 bits no paridad, no loopback, ON.

	U1STA=0x8000;	//b 1000 0000 0000 0000 Tx on , INT  cada caracter.

	U1BRG=10;		// para velocidad 57600x2. (Fcicle/(16BaudRate) - 1 ;

	IFS0bits.U1RXIF = 0;
	IEC0bits.U1TXIE=0; // deshabilita INT Tx UART1.
	IEC0bits.U1RXIE=1; // habilita INT RX 1.    transmite por UART1

	cAmarantaUartRxBufferIndex=0;
	cAmarantaUartTxBufferIndex=0;
}

void vAmarantaSerialTxDat(char N) // coloca numero de bytes a Tx  y habilita int para Tx.
{
	
	U1STAbits.UTXEN=0;		// deshabilita TX.
	cAmarantaUartTxBufferIndex=0;	
	ucAmarantaTxSize=N;	
	IEC0bits.U1TXIE=0;		// borra bandera de INT
	IEC0bits.U1TXIE=1;		// habilita INT
	U1STAbits.UTXEN=1;		// habilita TX.	
}

void __attribute__((__interrupt__,auto_psv)) _U1RXInterrupt(void)
{
	char cDataIn, qwer=0;
	
	pcAmarantaUartBufferRx[cAmarantaUartRxBufferIndex]= U1RXREG;	// almacena dato recibido.

	cDataIn=pcAmarantaUartBufferRx[cAmarantaUartRxBufferIndex];
	qwer=0;

	if(cDataIn=='Q')
	{
		qwer=1;
		Tx_can('1',PATA_1);
		pcAmarantaUartBufferTx[5]='1';	
	}

	if(cDataIn=='W')
	{
		qwer=1;
		Tx_can('2',PATA_2);
		pcAmarantaUartBufferTx[5]='2';
	}
	
	if(cDataIn=='E')
	{
		qwer=1;
		Tx_can('3',PATA_3);
		pcAmarantaUartBufferTx[5]='3';
		
	}

	if(cDataIn=='R')
	{
		qwer=1;
		Tx_can('4',PATA_4);
		pcAmarantaUartBufferTx[5]='4';
	}
	if (qwer){
		
		pcAmarantaUartBufferTx[0]='L';
		pcAmarantaUartBufferTx[1]='I';	
		pcAmarantaUartBufferTx[2]='S';
		pcAmarantaUartBufferTx[3]='T';	
		pcAmarantaUartBufferTx[4]='O';
		vAmarantaSerialTxDat(6);
		
	}

	if((++cAmarantaUartRxBufferIndex)>=MAXBUFRX_SIZE) 
		cAmarantaUartRxBufferIndex=0 ; // si pasa maximo de datos, pasa a cero.
	
	if(cDataIn==0x0D) 
		cAmarantaExecuteCommand=1; 	
	else 
		cAmarantaExecuteCommand=0;   
	
	IFS0bits.U1RXIF = 0; // borra INT.
}

void __attribute__((__interrupt__,auto_psv)) _U1TXInterrupt(void)
				// Rutina para Tx emty buffer. debe habilitarse INT en rutina de TX.
				// transmite NB_tx caracteres del buffer de transmicion. (asci_buf )
				// rutina de Tx debe colocar en cero ap_bufTx
{
	if(ucAmarantaTxSize == 0) 
		IEC0bits.U1TXIE=0; // deshabilita INT - ha transmitido todos los datos.
	else
	{
		while(ucAmarantaTxSize>0 && U1STAbits.UTXBF==0)    // coloca datos en buffer de tx hasta que 
												// no hay mas datos o se llena el buffer
		{
			U1TXREG=pcAmarantaUartBufferTx[cAmarantaUartTxBufferIndex++]; // Coloca dato a tx en TxReg. e incrementa apuntador.
			ucAmarantaTxSize--;
		}
	}
	IFS0bits.U1TXIF = 0;   	//  borra interrupci n
	IEC0bits.U1TXIE=1;			// habilita INT
}